#include "Lugar.h"
#include <string>
#include <iostream>
#include <algorithm> // find()

using namespace std;

// CONSTRUCTORES

Lugar::Lugar() {
	this->amigos = vector<Utilizador*>();
}

Lugar::Lugar(const std::string nome) {
	this->amigos = vector<Utilizador*>();
	this->nome = nome;
}

Lugar::~Lugar() {
	amigos.clear();
}

// METODOS

string Lugar::get_nome() const {
	return nome;
}

std::vector<Utilizador*> Lugar::get_utilizadores() const {
	return this->amigos;
}

int Lugar::get_numero_amigos() const {
	return amigos.size();
}

void Lugar::adicionar_amigo(Utilizador* amigo) {
	vector<Utilizador*>::iterator it;

	if ((it = find(amigos.begin(), amigos.end(), amigo)) == amigos.end()) {
		this->amigos.push_back(amigo);
		cout << "O utilizador " << amigo->get_nickname() << " esta agora no local " << get_nome() << "." << endl;
	}
}

void Lugar::remover_amigo(Utilizador* amigo) {
	for (unsigned int i = 0; i < amigos.size(); i++) {
		if (this->amigos[i]->get_nickname() == amigo->get_nickname()) {
			amigos.erase(amigos.begin() + i);
			cout << "O utilizador " << amigo->get_nickname() << " deixou de pertencer ao lugar " << get_nome() << "." << endl;
		}
	}
}

void Lugar::imprimir(std::ostream& out) const {
	out << "Lugar: " << get_nome();

	Lugar::imprimir_amigos(out);

	out << "." << endl;
}

void Lugar::imprimir_amigos(std::ostream& out) const {
	out << ", Amigos: ";

	for (unsigned int i = 0; i < amigos.size(); i++) {
		out << amigos[i]->get_nickname();
		if (i < (amigos.size() - 1))
			out << ", ";
	}

	if (amigos.size() == 0) {
		out << "Nao tem";
	}
}

const Lugar& Lugar::operator =(const Lugar& lugar) {
	this->nome = lugar.get_nome();
	this->amigos.clear();
	for (unsigned int i = 0; i < lugar.amigos.size(); i++) {
		amigos[i] = lugar.amigos[i];
	}

	return *this;
}

bool Lugar::operator ==(const Lugar& lugar) const {
	return this->get_nome() == lugar.get_nome();
}

bool Lugar::operator >(const Lugar& lugar) const {
	return this->get_nome() > lugar.get_nome();
}

ostream& operator <<(ostream& out, const Lugar& lugar) {
	lugar.imprimir(out);
	return out;
}
